package com.dragon.common.modules.uaa.web.api;

import com.chris.dev.base.libs.v1.http.params.NoneParam;
import com.chris.dev.base.libs.v1.http.results.CodeResult;
import com.chris.dev.base.libs.v1.http.results.ValueResult;
import com.dragon.common.modules.uaa.web.models.params.*;
import com.dragon.common.modules.uaa.web.models.results.LoginResult;
import com.dragon.common.spring.annotations.ResponseBodyPack;
import com.dragon.common.spring.openapi.ApiGroup;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * @author Chris Chan
 * Create On 2025/7/29 下午7:09
 * Use for: 账号(无需认证)
 * Explain:
 * 无需认证的账号相关接口，但是要注意限流
 */
@ResponseBodyPack
@ApiGroup("uaa")
@Tag(name = "账号(无需认证)", description = "账号相关接口，不需要认证")
public interface AuthAccountApi {
    /**
     * 获取图形验证码
     *
     * @param param 无参数
     * @return 验证码
     */
    @Operation(summary = "图形验证码", description = "获取图形验证码")
    @PostMapping("getGraphVerifyCode")
    CodeResult<String> getGraphVerifyCode(NoneParam param);

    /**
     * 发送手机短信验证码
     *
     * @param param 发送参数
     * @return 发送结果
     */
    @Operation(summary = "手机短信验证码", description = "发送手机短信验证码")
    @PostMapping("sendMobileVerifyCode")
    ValueResult<Boolean> sendMobileVerifyCode(MobileParam param);

    /**
     * 发送验证码邮件
     *
     * @param param 发送参数
     * @return 发送结果
     */
    @Operation(summary = "验证码邮件", description = "发送验证码邮件")
    @PostMapping("sendEmailVerifyCode")
    ValueResult<Boolean> sendEmailVerifyCode(EmailParam param);

    /**
     * 用户名密码注册
     *
     * @param param 注册参数
     * @return 注册结果
     */
    @Operation(summary = "注册(用户名+密码)", description = "用户名密码注册")
    @PostMapping("registerByUsernamePassword")
    ValueResult<Boolean> registerByUsernamePassword(RegisterByUsernamePasswordParam param);

    /**
     * 手机号验证码注册
     *
     * @param param 注册参数
     * @return 注册结果
     */
    @Operation(summary = "注册(手机号+验证码)", description = "手机号验证码注册")
    @PostMapping("registerByMobileVerifyCode")
    ValueResult<Boolean> registerByMobileVerifyCode(RegisterByMobileVerifyCodeParam param);

    /**
     * 邮箱验证码注册
     *
     * @param param 注册参数
     * @return 注册结果
     */
    @Operation(summary = "注册(邮箱+验证码)", description = "邮箱验证码注册")
    @PostMapping("registerByEmailVerifyCode")
    ValueResult<Boolean> registerByEmailVerifyCode(RegisterByEmailVerifyCodeParam param);

    /**
     * 用户名密码登录
     *
     * @param param 登录参数
     * @return 登录结果
     */
    @Operation(summary = "登录(用户名+密码)", description = "用户名密码登录")
    @PostMapping("loginByUsernamePassword")
    LoginResult loginByUsernamePassword(LoginByUsernamePasswordParam param);

    /**
     * 登录(手机号+验证码)
     *
     * @param param 登录参数
     * @return 登录结果
     */
    @Operation(summary = "登录(手机号+验证码)", description = "手机号验证码登录")
    @PostMapping("loginByMobileVerifyCode")
    LoginResult loginByMobileVerifyCode(LoginByMobileVerifyCodeParam param);

    /**
     * 登录(邮箱+验证码)
     *
     * @param param 登录参数
     * @return 登录结果
     */
    @Operation(summary = "登录(邮箱+验证码)", description = "邮箱验证码登录")
    @PostMapping("loginByEmailVerifyCode")
    LoginResult loginByEmailVerifyCode(LoginByEmailVerifyCodeParam param);

    /**
     * 重置密码
     * 通过手机号重置密码
     *
     * @param param 重置参数
     * @return 重置结果
     */
    @Operation(summary = "重置密码(手机号+验证码)", description = "通过手机号重置密码")
    @PostMapping("resetPasswordByMobile")
    ValueResult<Boolean> resetPasswordByMobile(ResetPasswordByMobileParam param);

    /**
     * 重置密码
     * 通过邮箱重置密码
     *
     * @param param 重置参数
     * @return 重置结果
     */
    @Operation(summary = "重置密码(邮箱+验证码)", description = "通过邮箱重置密码")
    @PostMapping("resetPasswordByEmail")
    ValueResult<Boolean> resetPasswordByEmail(ResetPasswordByEmailParam param);

    /**
     * 刷新登录凭证
     * 通过参数请求
     * 无需授权
     *
     * @param param 刷新参数
     * @return 刷新结果
     */
    @Operation(summary = "刷新登录凭证(刷新令牌)", description = "刷新登录凭证，需要刷新令牌参数，无需授权")
    @PostMapping("refreshLoginResult")
    LoginResult refreshLoginResult(TokenParam param);

    /**
     * 激活账号
     *
     * @param code 激活码
     * @return 激活结果
     */
    @Operation(summary = "激活账号(GET)", description = "激活账号，使用网络连接，用于邮件通知")
    @GetMapping("activateAccount")
    ValueResult<Boolean> activateAccount(@RequestParam("code") String code);
}
